package com.javastar.common.redis;

import cn.hutool.json.JSONUtil;
import com.javastar.common.utils.ValidatorUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * redis字符串操作工具类
 *
 * @author zxx
 * @date 2023/7/23
 */
@Component
public class RedisUtil {
    @Autowired
    private StringRedisTemplate redisTemplate;

    public void set(RedisKey redisKey, String key, Object value) {
        if (value instanceof String) {
            redisTemplate.opsForValue().set(redisKey.getKey() + key, (String) value, redisKey.getExpireTime(), redisKey.getUnit());
        } else {
            redisTemplate.opsForValue().set(redisKey.getKey() + key, JSONUtil.toJsonStr(value), redisKey.getExpireTime(), redisKey.getUnit());
        }
    }

    public String getStr(RedisKey redisKey, String key) {
        return redisTemplate.opsForValue().get(redisKey.getKey() + key);
    }

    public <T> T getBean(RedisKey redisKey, String key, Class<T> clazz) {
        String value = redisTemplate.opsForValue().get(redisKey.getKey() + key);
        if (ValidatorUtils.isEmpty(value)) {
            return null;
        }
        return JSONUtil.toBean(value, clazz);
    }

    public <T> List<T> getList(RedisKey redisKey, String key, Class<T> clazz) {
        return JSONUtil.toList(redisTemplate.opsForValue().get(redisKey.getKey() + key), clazz);
    }

    /**
     * 获取过期时间
     * @param redisKey
     * @return
     */
    public long getExpire(RedisKey redisKey, String key) {
        return redisTemplate.getExpire(redisKey.getKey() + key);
    }

    /**
     * 设置过期时间
     * @param redisKey
     */
    public void setExpire(RedisKey redisKey, String key) {
        redisTemplate.expire(redisKey.getKey() + key, redisKey.getExpireTime(), redisKey.getUnit());
    }

    public void delete(RedisKey redisKey, String key) {
        redisTemplate.delete(redisKey.getKey() + key);
    }

    /**
     * key是否存在
     * @param redisKey
     * @return
     */
    public boolean exist(RedisKey redisKey, String key) {
        return redisTemplate.hasKey(redisKey.getKey() + key);
    }

    /**
     * 自增
     * @param redisKey
     */
    public void increment(RedisKey redisKey, String key) {
        redisTemplate.opsForValue().increment(redisKey.getKey() + key);
    }

    /**
     * 自减
     * @param redisKey
     */
    public void decrement(RedisKey redisKey, String key) {
        redisTemplate.opsForValue().decrement(redisKey.getKey() + key);
    }

    /**
     * 不存在才设置
     * @param redisKey
     * @param value
     */
    public boolean setIfNotExist(RedisKey redisKey, String key, Object value) {
        if (value instanceof String) {
            return redisTemplate.opsForValue().setIfAbsent(redisKey.getKey() + key, (String) value, redisKey.getExpireTime(), redisKey.getUnit());
        } else {
            return redisTemplate.opsForValue().setIfAbsent(redisKey.getKey() + key, JSONUtil.toJsonStr(value), redisKey.getExpireTime(), redisKey.getUnit());
        }
    }
}
